# -*- coding: utf-8 -*-
# 集合模块

from collections import namedtuple,deque,defaultdict
from collections import OrderedDict,ChainMap,Counter
import os,argparse

# 创建一个自定义的tuple对象，并且规定了tuple元素的个数，并可以用属性而不是索引来引用
Point = namedtuple('Point',['x','y'])
p = Point(1,2)
print(p)
print(isinstance(p,Point))
print(isinstance(p,tuple))

Circle = namedtuple('Circle',['x','y','r'])
c = Circle(1,2,4)
print(c)

# deque 高效实现插入和删除操作的双向列表，适合用于队列和战
# 支持append() pop() appendleft() popleft()
q = deque(['a','b','c'])
q.append('x')
q.appendleft('y')
print(q)

# defaultdict 使用dict时，如果引用的Key不存在，就会抛出KeyError，
# 如果不存在时，返回一个默认值，就可以用defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
print(dd['key1'])
print(dd['key2']) #key2不存在，返回默认值


# OrderedDict
# 可以保证Key的顺序
# 注意，OrderedDict的Key会按照插入的顺序排列，不是Key本身排序：
d = dict([('a',1),('c',3),('b',2)])
print(d) # dict key是无序的

od = OrderedDict([('a',1),('c',3),('b',2)])
print(od) # key是有序的

od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
print(list(od.keys())) #按照插入的Key的顺序返回


# OrderedDict可以实现一个FIFO(先进先出)的dict,当容量超出限制时先删除最早添加的Key
class LastUpdateOrderedDict(OrderedDict):
	def __init__(self,capacity):
		super(LastUpdateOrderedDict,self).__init__()
		self._capacity = capacity

	def __setitem__(self,key,value):
		containsKey = 1 if key in self else 0
		if len(self) - containsKey >= self._capacity:
			last = self.popitem(last=False)
			print('remove:',last)
		if containsKey:
			del self[key]
			print('set:',(key,value))
		else:
			print('add:',(key,value))
		OrderedDict.__setitem__(self,key,value)

# 构造缺省参数
defaults = {
	'color':'red',
	'user':'guest'
}
# 构造命令行参数
parser = argparse.ArgumentParser()
parser.add_argument('-u','--user')
parser.add_argument('-c','--color')

namespace = parser.parse_args()
command_line_args={k:v for k,v in vars(namespace).items() if v}

# 组合成ChainMap
combined = ChainMap(command_line_args,os.environ,defaults)

# 打印参数
print('color=%s' % combined['color'])
print('user=%s' % combined['user'])

# Counter 是一个简单的计数器，例如：统计字符出现的个数
c = Counter()
for ch in 'programming':
	c[ch] = c[ch] + 1
print(c)